#include "controles.h"
#include <SDL/SDL.h>
#include <iostream>

using namespace std;

/******************************************************************************
    Este namespace serve para gerenciar os Joysticks usados
******************************************************************************/
namespace Controles{
    int joy_count;
    
    //Maximo de 4 joysticks
    SDL_Joystick* joy[4];
    
    //Controles[player][botao]
    // Botoes sao: 0 - Esquerda, 1-Direita, 2-Down, 3- Rodar
    // Player 5 sao controles universais.
    int controle[5][4];
    
/******************************************************************************
    Inicializa os objetos Joysticks.
******************************************************************************/
    bool Inicializar(void) {
         cout << "Joystick ...";
         cout.flush();
        joy_count = SDL_NumJoysticks();

        if (joy_count >= 1) {
            joy[0] = SDL_JoystickOpen(0);
            cout << "Joystick 1 configurado.\n";
            if (joy_count >= 2) {
                joy[1] = SDL_JoystickOpen(1);
                cout << "Joystick 2 configurado.\n";
                if (joy_count >= 3) {
                    joy[2] = SDL_JoystickOpen(2);
                    cout << "Joystick 3 configurado.\n";
                    if (joy_count >= 4) {
                        joy[3] = SDL_JoystickOpen(3);
                        cout << "Joystick 4 configurado.\n";
                    }
                }
            }
        }
        
        cout << "OK\n";
        cout.flush();
    }

/******************************************************************************
    Atualiza entidades de controles.
******************************************************************************/
    void Atualizar(void) {
         SDL_JoystickUpdate();
         Uint8 *estado_tecla = SDL_GetKeyState(NULL);
         
         controle[5][0] = estado_tecla[SDLK_ESCAPE];
         controle[5][1] = estado_tecla[SDLK_RETURN];
         controle[5][2] = estado_tecla[SDLK_LEFT];
         controle[5][3] = estado_tecla[SDLK_RIGHT];


         if (joy_count >= 1 ) {
              controle[0][0] = ((SDL_JoystickGetAxis(joy[0], 0) <= -30000) ? 1 : 0 );
              controle[0][1] = ((SDL_JoystickGetAxis(joy[0], 0) >= 30000) ? 1 : 0 );
              controle[0][2] = ((SDL_JoystickGetAxis(joy[0], 1) >= 30000) ? 1 : 0 );
              controle[0][3] = SDL_JoystickGetButton(joy[0], 1);

              if ( joy_count >= 2) {
                   controle[1][0] = ((SDL_JoystickGetAxis(joy[1], 0) <= -30000) ? 1 : 0 );
                   controle[1][1] = ((SDL_JoystickGetAxis(joy[1], 0) >= 30000) ? 1 : 0 );
                   controle[1][2] = ((SDL_JoystickGetAxis(joy[1], 1) >= 30000) ? 1 : 0 );
                   controle[1][3] = SDL_JoystickGetButton(joy[1], 1);
              
                   if ( joy_count >= 3) {
                       controle[2][0] = ((SDL_JoystickGetAxis(joy[2], 0) <= -30000) ? 1 : 0 );
                       controle[2][1] = ((SDL_JoystickGetAxis(joy[2], 0) >= 30000) ? 1 : 0 );
                       controle[2][2] = ((SDL_JoystickGetAxis(joy[2], 1) >= 30000) ? 1 : 0 );
                       controle[2][3] = SDL_JoystickGetButton(joy[2], 1);
              
                       if ( joy_count >= 4) {
                           controle[3][0] = ((SDL_JoystickGetAxis(joy[3], 0) <= -30000) ? 1 : 0 );
                           controle[3][1] = ((SDL_JoystickGetAxis(joy[3], 0) >= 30000) ? 1 : 0 );
                           controle[3][2] = ((SDL_JoystickGetAxis(joy[3], 1) >= 30000) ? 1 : 0 );
                           controle[3][3] = SDL_JoystickGetButton(joy[3], 1);
                       } else {
                           controle[3][0] = estado_tecla[SDLK_LEFT];
                           controle[3][1] = estado_tecla[SDLK_RIGHT];
                           controle[3][2] = estado_tecla[SDLK_DOWN];
                           controle[3][3] = estado_tecla[SDLK_UP];
                       }
                   } else {
                       controle[2][0] = estado_tecla[SDLK_LEFT];
                       controle[2][1] = estado_tecla[SDLK_RIGHT];
                       controle[2][2] = estado_tecla[SDLK_DOWN];
                       controle[2][3] = estado_tecla[SDLK_UP];
                       
                       controle[3][0] = estado_tecla[SDLK_a];
                       controle[3][1] = estado_tecla[SDLK_d];
                       controle[3][2] = estado_tecla[SDLK_s];
                       controle[3][3] = estado_tecla[SDLK_w];
                   }
              } else {
                  controle[1][0] = estado_tecla[SDLK_LEFT];
                  controle[1][1] = estado_tecla[SDLK_RIGHT];
                  controle[1][2] = estado_tecla[SDLK_DOWN];
                  controle[1][3] = estado_tecla[SDLK_UP];
                       
                  controle[2][0] = estado_tecla[SDLK_a];
                  controle[2][1] = estado_tecla[SDLK_d];
                  controle[2][2] = estado_tecla[SDLK_s];
                  controle[2][3] = estado_tecla[SDLK_w];
                  
                  controle[3][0] = estado_tecla[SDLK_4];
                  controle[3][1] = estado_tecla[SDLK_6];
                  controle[3][2] = estado_tecla[SDLK_5];
                  controle[3][3] = estado_tecla[SDLK_8];
              }
         } else {
             controle[0][0] = estado_tecla[SDLK_LEFT];
             controle[0][1] = estado_tecla[SDLK_RIGHT];
             controle[0][2] = estado_tecla[SDLK_DOWN];
             controle[0][3] = estado_tecla[SDLK_UP];
                     
             controle[1][0] = estado_tecla[SDLK_a];
             controle[1][1] = estado_tecla[SDLK_d];
             controle[1][2] = estado_tecla[SDLK_s];
             controle[1][3] = estado_tecla[SDLK_w];
                 
             controle[2][0] = estado_tecla[SDLK_4];
             controle[2][1] = estado_tecla[SDLK_6];
             controle[2][2] = estado_tecla[SDLK_5];
             controle[2][3] = estado_tecla[SDLK_8]; 

             controle[3][0] = estado_tecla[SDLK_j];
             controle[3][1] = estado_tecla[SDLK_l];
             controle[3][2] = estado_tecla[SDLK_k];
             controle[3][3] = estado_tecla[SDLK_i];
         }
    }
    
/******************************************************************************
    Retorna estado de um botao.
******************************************************************************/
    int Get(int player, int botao) {
         return controle[player][botao];
    }
}
